IT鐵人
上一次我們提到Pipeline可以提升速度,不過捷徑一定比較難走,小時候完馬力歐賽車也是捷徑比較難進去或是很難通過。
Pipeline也是一樣,會遇到一些為了加速而遇到的阻礙。
Pipeline主要遇到Hazard為下列三者︰
類型 | 原因 |
---|---|
Structural Hazard(結構危障) | 硬體資源不夠多,導致在同一時間內要執行的多個指令無法執行。 |
Data Hazard(資料危障) | Pipeline中某一指令需要用到前面指令尚未產生的結果,也就是執行的指令所需的資料還無法獲得。 |
Control Hazard(控制危障) | Branch的結果尚未產生時,後續的指令就已經進入Pipeline,如果決定要branch到別的位置便會發生錯誤。所以又稱為Branch Hazard。 |
資源太少
如果我們只有一個單一記憶體,而不是兩個分離的記憶體。那麼Instruction Memory跟Data Memory要同時被存取時,就會發生Structural Hazard。如下︰
這時候就會讓記憶體被兩個指令存取,會導致無法執行產生Hazard。
不過基本上都會把兩個分開來執行啦,所以不用擔心這個。
資料舊了
Data Hazard發生的情況是,前後的指令都有用到同一個Register,不過前面修改的值還沒放回Register中,後面就直接對他取值,將導致資料是錯誤的狀況,比如說以下狀況:
這五個指令都有用到r1 Register,不過第一行的add結果要在最後的WB才會寫回去Register中,導致後面的sub跟and都會拿到尚未修改的值,不符合原先的期望。
除了最後的xor因為在下一個Cycle才取值,一定沒問題外,前面的or指令不會發生的原因為:WB在Cycle前半完成,而ID是在Cycle後半才開始,所以不會發生Data Hazard。
做白工
Control Hazard特別的事情在於不是每次Branch指令都會發生,而是萬一Branch的結果為真(需要跳到別的位置執行),才會發生Control Hazard。以下圖為例:
假設beq指令成立,要跳到64位址執行slt,那麼中間的and, or, sub等等的指令都需要作廢,這時候就稱為Control Hazard。
這次跟大家談到了hazard的類型,下次會跟大家說明怎麼解決hazard。不知道聰明如你有沒有想到什麼簡單的解決方式呢?
上一篇 | 下一篇 |
---|---|
Pipeline | 在Hazard尋求解法是否搞錯了什麼 |
跟大家補充一個小故事,BIOHAZARD這個字,其實就是我們熟悉的惡靈古堡系列,不過因為美國紐約有一個樂團已經把這個字註冊為樂團名字,所以歐美版本就使用了現在大部份人熟悉的Resident Evil。
臺灣使用了就是歐美版,聽說中國大陸跟香港則繼續使用BIOHAZARD。
BIOHAZARD | RESIDENT EVIL |
---|---|